/**
 * 天气查询服务
 * 
 * 这个文件提供了一个基于Open-Meteo API的天气查询服务
 * 需要安装依赖: npm install express axios
 */

const express = require('express');
const axios = require('axios');

// 创建 Express 应用
const app = express();
const port = 3000;

// Open-Meteo API配置（不需要API密钥）
const OPEN_METEO_API_URL = 'https://api.open-meteo.com/v1';
const GEOCODING_API_URL = 'https://geocoding-api.open-meteo.com/v1/search';

// 天气状况代码映射（Open-Meteo使用WMO代码）
const weatherCodeMap = {
  0: '晴天',
  1: '晴天，少云',
  2: '晴间多云',
  3: '多云',
  45: '雾',
  48: '雾凇',
  51: '小毛毛雨',
  53: '中毛毛雨',
  55: '大毛毛雨',
  56: '冻小毛毛雨',
  57: '冻大毛毛雨',
  61: '小雨',
  63: '中雨',
  65: '大雨',
  66: '冻小雨',
  67: '冻大雨',
  71: '小雪',
  73: '中雪',
  75: '大雪',
  77: '雪粒',
  80: '小阵雨',
  81: '中阵雨',
  82: '大阵雨',
  85: '小阵雪',
  86: '大阵雪',
  95: '雷暴',
  96: '雷暴伴随小冰雹',
  99: '雷暴伴随大冰雹'
};

// 获取城市天气数据
async function getWeatherData(cityName) {
  try {
    // 1. 先通过城市名称获取经纬度
    const geoResponse = await axios.get(`${GEOCODING_API_URL}?name=${encodeURIComponent(cityName)}&count=1&language=zh`);
    
    if (!geoResponse.data.results || geoResponse.data.results.length === 0) {
      return null; // 城市未找到
    }
    
    const cityData = geoResponse.data.results[0];
    const { latitude, longitude, name } = cityData;
    
    // 2. 通过经纬度获取实时天气
    const weatherUrl = `${OPEN_METEO_API_URL}/forecast?latitude=${latitude}&longitude=${longitude}&current=temperature_2m,relative_humidity_2m,weather_code,wind_speed_10m,wind_direction_10m&timezone=auto`;
    const weatherResponse = await axios.get(weatherUrl);
    
    if (!weatherResponse.data || !weatherResponse.data.current) {
      throw new Error('获取天气数据失败');
    }
    
    const current = weatherResponse.data.current;
    const weatherCode = current.weather_code;
    
    return {
      city: name, 
      temperature: `${current.temperature_2m}°C`,
      condition: weatherCodeMap[weatherCode] || `未知天气代码(${weatherCode})`,
      humidity: `${current.relative_humidity_2m}%`,
      windDirection: getWindDirection(current.wind_direction_10m),
      windSpeed: `${current.wind_speed_10m}km/h`
    };
  } catch (error) {
    console.error(`获取${cityName}天气数据失败:`, error);
    throw error;
  }
}

// 根据风向角度获取风向描述
function getWindDirection(degree) {
  const directions = ['北风', '东北风', '东风', '东南风', '南风', '西南风', '西风', '西北风', '北风'];
  return directions[Math.round(degree / 45) % 8];
}

// 创建天气API路由
app.get('/api/weather/:city', async (req, res) => {
  try {
    const city = req.params.city;
    const weatherData = await getWeatherData(city);
    
    if (weatherData) {
      res.json(weatherData);
    } else {
      res.status(404).json({ error: `未找到城市 "${city}" 的天气信息` });
    }
  } catch (error) {
    res.status(500).json({ error: `获取天气数据失败: ${error.message}` });
  }
});

// 默认路由，提供使用说明
app.get('/api/weather', (req, res) => {
  res.json({
    message: '请使用 /api/weather/城市名 来查询具体城市天气，支持全国各地城市查询'
  });
});

// 首页
app.get('/', (req, res) => {
  res.send(`
    <h1>天气查询服务</h1>
    <p>支持查询全国所有城市的天气信息</p>
    <p>使用方式: /api/weather/城市名</p>
    <p>示例:</p>
    <ul>
      <li><a href="/api/weather/北京">查询北京天气</a></li>
      <li><a href="/api/weather/上海">查询上海天气</a></li>
      <li><a href="/api/weather/广州">查询广州天气</a></li>
      <li><a href="/api/weather/深圳">查询深圳天气</a></li>
      <li><a href="/api/weather/成都">查询成都天气</a></li>
      <li>...以及全国其他城市</li>
    </ul>
  `);
});

// 启动服务器
app.listen(port, () => {
  console.log(`天气查询服务运行在 http://localhost:${port}/`);
  console.log('支持查询全国所有城市的天气');
  console.log('使用方式: http://localhost:3000/api/weather/城市名');
});

/**
 * 要运行此示例:
 * 1. 安装依赖: npm install express axios
 * 2. 运行: node src/weather.js
 */ 